package com.report.conversion.utils;

import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.stereotype.Component;

import javax.sql.DataSource;
import java.util.HashMap;

/**
 * 初始化多数据源以及湖区数据库连接
 *
 * @author: kevin wu
 * @date: 2023年03月14日 13:39
 */

@Component
public class DataSourceUtils {

    public static HashMap<String ,Object> datasourceMaps = new HashMap<>();

    /***
     * @description 根据数据源id获取数据源
     * @param dsId  数据源id
     * @return javax.sql.DataSource
     * @author kevin wu
     * @date 2023/3/14 15:55
     */
    public DataSource getDatasource(String dsId){
        if(datasourceMaps.containsKey(dsId)){
            return (DataSource)datasourceMaps.get(dsId);
        }else{
            return null;
        }
    }

    /***
     * @description 初始化数据源 放入缓存中
     * @param dsId 数据源id
     * @param dsMap 数据库连接参数
     * @return void
     * @author kevin wu
     * @date 2023/3/14 15:55
     */
    public void initDataSources(String dsId,HashMap dsMap){
        DataSource datasource = getDatasource(dsMap);
        datasourceMaps.put(dsId,datasource);
    }

    /***
     * @description 根据数据库参数创建数据源
     * @param dsMap  数据库参数
     * @return javax.sql.DataSource
     * @author kevin wu
     * @date 2023/3/14 15:57
     */
    public DataSource getDatasource(HashMap dsMap){

        try {

            Object type = dsMap.get("type");
            if (type == null){
                type = "com.zaxxer.hikari.HikariDataSource";// 默认DataSource
            }
            Class<? extends DataSource> dataSourceType;
            dataSourceType = (Class<? extends DataSource>)Class.forName((String)type);
            String driverClassName = dsMap.get("driver").toString();
            String url = dsMap.get("url").toString();
            String username = dsMap.get("username").toString();
            String password = dsMap.get("password").toString();
            // 自定义DataSource配置
            DataSourceBuilder factory = DataSourceBuilder.create()
                    .driverClassName(driverClassName)
                    .url(url)
                    .username(username)
                    .password(password)
                    .type(dataSourceType);
            return factory.build();

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        return null;
    }
}
